﻿#pragma once
#include "AsQBasicGlobal.h"
#include <QMetaType>
#include <QMap>

// 元对象使用流程
// 声明AS_DECLARE_META_TYPE(特化模板)->
// 注册asRegisterConfigMetaType/asRegisterMetaType(类型放入类型集)->
// 初始化(根据类型名称实例化对象)AsMetaGlobal::asCreateMetaObject
typedef void*(*AsMetaCtor)();			//元类型构造器
 
class AS_QBASIC_EXPORT AsMetaType {
private:
	static QMap<QString, AsMetaCtor> ms_mpMetaCtor;

public:
	// 构建元数据对象
	static void* asCreateMetaObject(QString metaType);

	// 判断是否含有某个元对象
	static bool hasMetaType(QString metaType);

	// 添加元对象类型
	static void addMetaType(QString, AsMetaCtor ctor);

};

/**
 * 注册As元数据类型
 */
template<typename T>
void asRegisterMetaType() {
	AsMetaType::addMetaType(asMetaType<T>(), &AsMetaTypeId<T>::as_create);
}

/**
 * 元数据类型名称
 */
template<typename T>
QString asMetaType() {
	return AsMetaTypeId<T>::as_meta_type();
}

/**
 * 元数据类模板
 */
template<typename TYPE>
struct AsMetaTypeId {

};

/**
 * 宏定义，模板特化
 */
#define AS_DECLARE_META_TYPE(TYPE) AS_DECLARE_META_TYPE_IMPL(TYPE)
#define AS_DECLARE_META_TYPE_IMPL(TYPE) \
	template<>\
	struct AsMetaTypeId<TYPE>\
	{\
		static QString as_meta_type(){			\
			return	QString(#TYPE);	\
		}\
		static void* as_create(){\
			return new TYPE();\
		}\
	};\

#if 0


#define asMetaType(__type__) #__type__
#define asCreateMetaType(__type__) AsMetaTypeManager::createMetaObject<__type__>(#__type__)

class AsMetaTypeManager {
public:
	template <typename _Type>
	static _Type* createMetaObject(QString metaType) {
		return new _Type();
	}

};

class MyType {};

void CallExample() {

	// 使用方式1
	AsMetaTypeManager::createMetaObject<MyType>(asMetaType(MyType));

	// 使用方式2
	asCreateMetaType(MyType);

}

#define asTypeName(__type__) #__type__



#endif